package com.aaa.sbm.controller;


import com.aaa.sbm.controller.BaseController;
import com.aaa.sbm.entity.Dept;
import com.aaa.sbm.service.DeptService;
import com.aaa.sbm.util.BaseUtil;
import com.aaa.sbm.util.Page;
import com.aaa.sbm.util.Result;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

// @Controller
@RestController //相当于@Controller和@ResponseBody组合    该类中的所有方法，默认返回json
@RequestMapping("/dept")
//@Log4j2
@Slf4j
public class DeptController {
    @Resource
    private DeptService deptService;

   // private Logger log = LoggerFactory.getLogger(DeptController.class);


    /**
     * 根据分页参数查询部门信息。
     * <p>
     * 通过POST请求调用，使用@RequestBody注解将请求体中的Page对象绑定为方法参数。
     * Page对象包含了分页信息和过滤条件，使得可以在服务层进行精确的分页查询。
     * </p>
     * @param page 包含分页信息和过滤条件的Page对象。
     * @return 返回查询结果的Result对象。Result对象封装了查询结果和操作状态信息。
     */
    @PostMapping("queryByPage") //因为post支持request的Body方法json字符串
    @ApiOperation("分页查询方法")
    public Result queryByPage(@RequestBody Page<Dept> page){
        log.info("进入了queryByPage方法333--------------");
        log.info("进入了queryByPage方法111--------------");
        // 调用部门服务的queryByPage方法进行分页查询，并使用BaseUtil.success方法封装查询结果。
        Result result = BaseUtil.success(deptService.queryByPage(page));
        log.info("离开了queryByPage方法222--------------");
        return result;
    }
    /**
     * 根据编号返回对象
     * @param deptNo
     * @return
     */
    @GetMapping("queryById")
    @ApiOperation("根据编号查询对象")
    //@ResponseBody
    public Result  queryById1(@ApiParam("部门编号") Integer deptNo){
        log.info("进入了queryById1方法--------------");
        // return new Result(2000,"查询成功2",deptService.queryById(deptNo));//魔法值，不同的开发人员可能写不同的数字，不同的返回信息，不好
        //统一返回结果 代码是两行  有点多
       /* return new Result(ResultStatus.SUCCESS.getReturnCode(),
                ResultStatus.SUCCESS.getReturnMessage(),deptService.queryById(deptNo));*/
        Result result = BaseUtil.success(deptService.queryById(deptNo));
        log.info("queryById1方法执行结束--------------");
        return result;
    }

    /**
     * 根据编号返回对象
     * @param deptNo
     * @return
     */
    @GetMapping("queryByIdA")
    @ApiOperation("根据编号查询对象")
    @RequiresRoles("guanliyuan")  //配置访问该方法时，必须拥有的角色
    //@ResponseBody
    public Result  queryByIdA(@ApiParam("部门编号") Integer deptNo){
        log.info("进入了queryById1方法--------------");
        // return new Result(2000,"查询成功2",deptService.queryById(deptNo));//魔法值，不同的开发人员可能写不同的数字，不同的返回信息，不好
        //统一返回结果 代码是两行  有点多
       /* return new Result(ResultStatus.SUCCESS.getReturnCode(),
                ResultStatus.SUCCESS.getReturnMessage(),deptService.queryById(deptNo));*/
        Result result = BaseUtil.success(deptService.queryById(deptNo));
        log.info("queryById1方法执行结束--------------");
        return result;
    }

    /**
     * 根据编号返回对象
     * @param deptNo
     * @return
     */
    @GetMapping("queryByIdB")
    @ApiOperation("根据编号查询对象")
    @RequiresPermissions("dept:queryById")  //配置访问该方法时，必须拥有的权限  dept:queryById
    //@ResponseBody
    public Result  queryByIdB(@ApiParam("部门编号") Integer deptNo){
        // 记录进入方法的日志
        log.info("进入了queryByIdB方法--------------");
        // 调用部门服务查询部门信息，并使用BaseUtil.success方法包装结果
        Result result = BaseUtil.success(deptService.queryById(deptNo));
        // 记录方法执行结束的日志
        log.info("queryByIdB方法执行结束--------------");
        return result;
    }
    /**
     * 根据参数查询
     * @return
     */
    //@RequestMapping(value = "queryByParam",method = {RequestMethod.GET})
    @GetMapping("queryByParam")
    //@ResponseBody  //返回deptList集合转换json  如果不加会找视图解析器  找对应视图 /WEB-INF/jsp/dept/queryByParam.jsp 找不到就404
    public Result queryByParam(Page<Dept> page) {
        // return new Result(20,"查询成功1",deptList); //魔法值，不同的开发人员可能写不同的数字，不同的返回信息，不好
        //统一返回结果 代码是两行  有点多
       /* return new Result(ResultStatus.SUCCESS.getReturnCode(),
                ResultStatus.SUCCESS.getReturnMessage(),deptList);*/
        return BaseUtil.success( deptService.queryByPage(page));
    }



    /**
     * 添加
     * @param dept
     * @return
     */
    @PostMapping("add") //HTTP状态 405 - 方法不允许   地址栏请求的方式只能是get
    //@ResponseBody
    private Result add(@RequestBody Dept dept){
        return   BaseUtil.success(deptService.add(dept));
    }

    /**
     * 更新
     * @param dept
     * @return
     */
    @PutMapping("update")
    //@ResponseBody
    private Result  update(@RequestBody Dept dept){
        return BaseUtil.success(deptService.update(dept));
    }

    /**
     * 根据编号删除
     * @param deptNo
     * @return
     */
    @DeleteMapping("delete")
    //@ResponseBody
    private Result delete(Integer deptNo){
        return BaseUtil.success(deptService.deleteById(deptNo));
    }
}
